package org.truenewx.tnxjee.webmvc.security.web;

import java.io.IOException;
import java.util.List;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import org.truenewx.tnxjee.service.exception.ResolvableException;
import org.truenewx.tnxjee.service.exception.model.ExceptionError;

/**
 * rest请求响应结果决定者
 */
public interface RestResponseResultDecider {

    String ATTR_DEFAULT_STATUS = RestResponseResultDecider.class.getName() + ".DEFAULT_STATUS";

    /**
     * @param request http请求
     * @return 是否支持对指定请求的响应结果决定
     */
    boolean supports(HttpServletRequest request);

    /**
     * 当匿名用户试图访问登录后才能访问的请求时的处理
     *
     * @param request  http请求
     * @param response http响应
     */
    void commenceForEntryPoint(HttpServletRequest request, HttpServletResponse response);

    /**
     * @return 登录失败后的响应状态码
     */
    int getAuthenticationFailureStatus();

    /**
     * @return 越权访问被拒绝时的响应状态码
     */
    int getAccessDeniedStatus();

    /**
     * @param re 出现的可解决异常
     * @return 出现可解决异常时的响应状态码
     */
    int getResolvableExceptionStatus(ResolvableException re);

    /**
     * 处理运行期异常
     *
     * @param request  http请求
     * @param response http响应
     * @param ex       运行期异常
     * @throws IOException 如果处理过程中出现错误
     */
    void resolveRuntimeException(HttpServletRequest request, HttpServletResponse response, RuntimeException ex)
            throws IOException;

    /**
     * 获取错误时的响应体内容对象
     *
     * @param errors 异常错误集
     * @return 错误时的响应体内容对象
     */
    Object getErrorBody(List<ExceptionError> errors);

    /**
     * 获取正常处理时的响应体内容对象
     *
     * @param returnValue 正常处理时的返回值
     * @return 正常处理时的响应体内容对象
     */
    Object getReturnBody(Object returnValue);

}
